package com.wei.czz.framework.common.manager;

import com.wei.czz.common.constant.Constant;
import com.wei.czz.common.constant.EntityConstant;
import com.wei.czz.common.dto.common.NameValue;
import com.wei.czz.common.dto.common.importTask.ImportTaskDto;
import com.wei.czz.common.dto.common.importTask.ImportTaskPageEnumDto;
import com.wei.czz.common.enums.CommonEnum;
import com.wei.czz.common.enums.common.FileTypeEnum;
import com.wei.czz.common.enums.common.TaskModeEnum;
import com.wei.czz.common.enums.common.importTask.ImportTaskTypeEnum;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.utils.CacheKeyUtils;
import com.wei.czz.common.utils.CopyUtils;
import com.wei.czz.common.utils.SecurityUtils;
import com.wei.czz.common.vo.common.importTask.ImportTaskFormVo;
import com.wei.czz.framework.common.entity.ImportTaskEntity;
import com.wei.czz.framework.common.helper.CacheHelper;
import com.wei.czz.framework.common.service.ImportTaskService;
import com.wei.czz.framework.common.wrapper.MinioWrapper;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wyw
 * date: 2024-06-29 16:32:09
 * className: ImportTaskManager
 * version: 1.0
 * description:
 */
@Component
@AllArgsConstructor
public class ImportTaskManager {

    private static final Logger log = LoggerFactory.getLogger(ImportTaskManager.class);

    private final ImportTaskService importTaskService;

    private final CacheHelper cacheHelper;

    private final MinioWrapper minioWrapper;

    public PageDto<ImportTaskDto> getImportTaskPageList(ImportTaskFormVo importTaskFormVo) {
        // 获取请求用户主键
        Long optUserId = SecurityUtils.getUserId();

        /*
            缓存请求参数
         */
        String cacheKey = CacheKeyUtils.getParamCacheKey(EntityConstant.IMPORT_TASK);
        cacheHelper.cache(cacheKey, importTaskFormVo);

        importTaskFormVo.setUserId(optUserId);

        /*
            分页获取文件导入任务操作
         */
        PageDto<ImportTaskEntity> pageDto = importTaskService.getPageList(importTaskFormVo);
        if (pageDto.isEmpty()) {
            return pageDto.rebuild();
        }

        long now = System.currentTimeMillis();
        long day30 = Constant.ONE_DAY_NUM * 30L;

        List<ImportTaskEntity> importTaskList = pageDto.getList();
        List<ImportTaskDto> importTaskDtoList = CopyUtils.mapList(importTaskList, importTask -> {
            ImportTaskDto importTaskDto = CopyUtils.map(importTask, ImportTaskDto.class);
            importTaskDto.setTypeName(ImportTaskTypeEnum.getName(importTask.getType()))
                    .setModeName(TaskModeEnum.getName(importTask.getMode()))
                    .setFileTypeName(FileTypeEnum.getName(importTask.getFileType()))
                    .setStatusName(CommonEnum.ZERO.getValue().equals(importTask.getStatus()) ? "正在导入" : "导入结束");
            if (now - importTask.getCreateTime().getTime() < day30) {

                if (!CommonEnum.MINUS_ONE.getLongValue().equals(importTask.getSuccessFileNo())) {
                    /*
                        生成下载链接
                     */
                    importTaskDto.setSuccessFileUrl(
                            minioWrapper.buildDownloadUrl(importTask.getSuccessFileNo(), 1, TimeUnit.HOURS)
                    );
                }
                if (!CommonEnum.MINUS_ONE.getLongValue().equals(importTask.getFailFileNo())) {
                    /*
                        生成下载链接
                     */
                    importTaskDto.setFailFileUrl(
                            minioWrapper.buildDownloadUrl(importTask.getFailFileNo(), 1, TimeUnit.HOURS)
                    );
                }
            }
            return importTaskDto;
        });
        // 封装返回
        return pageDto.rebuild(importTaskDtoList);
    }

    public ImportTaskPageEnumDto getPageEnum() {

        /*
            获取请求参数缓存
         */
        String cacheKey = CacheKeyUtils.getParamCacheKey(EntityConstant.IMPORT_TASK);
        ImportTaskFormVo importTaskFormVo = cacheHelper.get(cacheKey, ImportTaskFormVo.class);

        List<NameValue<Integer>> statusList = new ArrayList<>();
        statusList.add(new NameValue<>("正在导入", CommonEnum.ZERO.getValue()));
        statusList.add(new NameValue<>("导入结束", CommonEnum.ONE.getValue()));

        ImportTaskPageEnumDto importTaskPageEnumDto = new ImportTaskPageEnumDto();
        importTaskPageEnumDto.setTypeList(ImportTaskTypeEnum.getList())
                .setModeList(TaskModeEnum.getList())
                .setStatusList(statusList)
                .setImportTaskFormVo(importTaskFormVo);
        return importTaskPageEnumDto;
    }

}
